Docker compose Apache, php , Mysql(APM) 서버 구축
🔎

Docker compose Apache, php , Mysql(APM) 서버 구축

Lecture
Dev
태그
docker
dev
web
public
완성
Y
생성일
Mar 16, 2024 05:27 AM
LectureName
Docker

1. Docker compose란?

Docker Compose는 Docker 컨테이너 애플리케이션을 정의, 실행 및 관리하기 위한 도구입니다. Compose는 YAML 파일을 사용하여 여러 개의 도커 컨테이너를 정의하고 구성할 수 있으며, 이를 통해 멀티 컨테이너 애플리케이션의 배포와 관리를 단순화할 수 있습니다.
 
Docker Compose를 사용하면 애플리케이션의 구성 요소(서비스)를 정의하고 이들 사이의 관계를 설정할 수 있습니다. 각 서비스는 독립적인 컨테이너로 실행되며, Compose는 이러한 컨테이너들 간의 네트워크 연결, 볼륨 마운트, 환경 변수 등을 관리합니다.
 
조금 어려운 말로 설명하는 정의는 이렇지만 간단히 말하면 다수의 컨테이너를 하나의 지시서에 설정하고, 관리할 수 있는 도구라고 할 수 있습니다. docker-compose.yml파일에 해당 컨테이너들에서 초기에 동작할 설정을 정리(빌드, 마운트 볼륨, 포트포워딩) 하고 실행시키면 컨테이너 네트워크 환경을 구축할 수 있습니다.
 
notion image
Docker compose 실행 시 컨테이너 동작 과정
 
 
 

2. APM 이란?

APM은 Apache, PHP, Mysql로 이루어진 환경 으로 처음 웹사이트 개발을 한다면 가장 많이 개발되었던 조합입니다. 각각의 역할은 다음과 같습니다.
 
Apache2
  • 웹 서버 소프트웨어로서, 클라이언트의 HTTP 요청을 처리하고 정적인 웹 페이지를 제공합니다.
  • Apache2는 클라이언트에서 받은 요청을 PHP나 다른 서버 측 스크립트로 전달하여 동적인 컨텐츠를 생성합니다.
 
PHP
  • 서버 측 스크립트 언어로, 웹 서버에서 실행되어 동적인 웹 페이지를 생성합니다.
  • 데이터베이스와 상호 작용하고, 사용자 입력을 처리하며, 동적인 컨텐츠를 생성하여 클라이언트에게 제공합니다.
  • Apache2와 함께 사용될 때, Apache2는 PHP 스크립트를 실행하고 그 결과를 클라이언트에게 반환합니다.
 
MySQL
  • MySQL은 오픈 소스 관계형 데이터베이스 관리 시스템(RDBMS)입니다.
  • MySQL은 데이터를 저장, 관리, 검색하기 위한 기능을 제공합니다.
  • PHP와 함께 사용될 때, PHP는 MySQL 데이터베이스에 접속하여 데이터를 쿼리하고 조작할 수 있습니다.
 
 
 

3. Docker-compose.yml

Docker-compose는 docker-compose.yml 이라는 정의된 파일에 의하여 실행됩니다. 서비스, 볼륨, 네트워크 등등을 명시하고 해당 파일이 존재하는 디렉터리에서 docker-compose up 명령어를 사용하면 됩니다.
 
예시로 APM 환경을 구축하는 Docker-compose.yml 파일을 준비하였습니다.
version: '3.9' services: web: build: context: . dockerfile: Dockerfile depends_on: - db volumes: - ./web_src/public:/var/www/html/ - ./web_src/:/var/www/ ports: - 8080:80 db: container_name: mysql8 image: mysql:8.0 command: --default-authentication-plugin=mysql_native_password environment: MYSQL_DATABASE: #여기에 db이름을 넣는다. MYSQL_USER: #여기에 아이디를 넣는다 MYSQL_PASSWORD: #여기에 비밀번호를 넣는다. MYSQL_ROOT_PASSWORD: ABCD #이런식으로 volumes: - ./mysql/init:/docker-entrypoint-initdb.d phpmyadmin: image: phpmyadmin/phpmyadmin:4.7 depends_on: - db ports: - "89:80" environment: - "PMA_HOST=여기다" - "PMA_USER=넣으면" - "PMA_PASSWORD=됩니다"
  • 저는 추가적으로 phpmyadmin을 구성했습니다,
  • 필요 없으신 분들은 phpmyadmin 부분을 지워주시면 됩니다.
 
 
+ Dockerfile
FROM php:7.3.3-apache RUN docker-php-ext-install mysqli EXPOSE 80
 
 
추가적으로 설정을 바꾸실 분들은 아래 설명을 보고 바꾸시면 됩니다.
Docker-compose.yml 작성 시 문법
구문
설명
version
Compose 파일 형식의 버전을 지정합니다.
services
응용 프로그램에서 실행할 서비스를 지정합니다.
build
서비스에 대한 빌드 구성을 지정합니다.
image
서비스에 사용할 이미지를 지정합니다.
ports
서비스가 노출할 포트를 지정합니다.
volumes
서비스에 마운트할 볼륨을 지정합니다.
environment
서비스에 대한 환경 변수를 지정합니다.
command
서비스에 대해 실행할 명령을 지정합니다.
depends_on
서비스에 대한 종속성을 지정합니다.
networks
서비스에 사용할 네트워크를 지정합니다.
restart
서비스에 대한 다시 시작 정책을 지정합니다.
기본적으로 해당 명령어들을 알고 있다면 Docker-compose.yml을 작성할 수 있습니다.
 
 
 
그럼 컨테이너는 서로 어떻게 통신하나요?
Docker Compose에서 기본적으로 생성되는 bridge 네트워크로 통신합니다. 컨테이너는 각각의 IP 주소를 가지고 있지만 Compose는 기본적으로 컨테이너 이름으로 DNS(Domain Name System)를 구성하므로, 서비스 이름으로 컨테이너 간 통신을 할 수 있습니다. (위에 있는 db, web등 )
 
이를 통해 하나의 컨테이너에서 다른 컨테이너로 요청을 보낼 때, 서비스 이름을 사용하여 요청할 수 있습니다.
 
하지만 사용자 정의 네트워크를 생성하여 각 서비스에 할당하는 것이 좋습니다. 이렇게 하면 컨테이너 간 통신이 더욱 안전하고 유연해지며, 서비스를 더욱 구조화하여 관리할 수 있습니다. 사용자 정의 네트워크를 생성하려면, Compose 파일에서 networks 항목을 추가하고 각 서비스에서 이 네트워크를 사용하도록 설정합니다.
 
♣ 사용자 정의 네트워크를 사용해서 네트워크를 구성한 모습
networks: my-network:
 
 
+) 팁
추가적으로 각각 컨테이너 별로 빌드를 수행하고 compose 할 수 있습니다.
version: '3.9' services: web: build: context: . dockerfile: Dockerfile-1 ports: - "3000:3000" api: build: context: . dockerfile: Dockerfile-2 ports: - "5000:5000"
  • context는 경로를 의미합니다. dockerfile이 한 디렉터리에 두개 이상 있다면 dockerfile 이름을 명시해주어야 합니다.
 
 
주의사항
  • yml파일 작성 시 문법이 조금만 틀려도 문제가 발생합니다.
  • docker 포멧을 지원하는 에디터를 사용해서 스트레스를 줄이는걸 추천드립니다.